package com.ajaxjs.user.password;

public class ServerSide extends Password {
	/**
	 * 
	 * @param aesKey 必填的 AES 密钥
	 */
	public ServerSide(String aesKey) {
		setAesKey(aesKey);
	}

	/**
	 * 服务器专用密钥
	 */
	private String serverAES_key;

	/**
	 * 注册成功后，服务器保存的用户密码是 SavedPassword。
	 * 
	 * @param encryptedPassword
	 *            注册时客户端在注册接口里提交 EncryptedPassword
	 * @return 服务器专用密钥
	 */
	public String getSavedPassword(String encryptedPassword) {
		String hashedPassword = getHashedPassword(encryptedPassword, getAesKey());

		// 有了 ServerSalt，即使两个用户的密码相同，最后的 EncryptedPassword 也会不一样。
		setSalt(passwordGenerator());

		String savedPassword = Encryption.AES_Encrypt(getSalt() + hashedPassword, getServerAES_key());
		return savedPassword;
	}

	private String getHashedPassword(String encryptedPassword, String key) {
		String salted = Encryption.AES_Decrypt(encryptedPassword, key);
		// 服务器用AesKey解出ClientSalt +
		// HashedPassword，因为ClientSalt固定22字节，能计算得到HashedPassword
		String hashedPassword = salted.substring(getSaltSize(), salted.length());

//		System.out.println("salted:" + salted);
//		System.out.println("hashedPassword:" + hashedPassword);

		return hashedPassword;
	}

	/**
	 * 密码是否正确
	 * 
	 * @param encryptedPassword
	 *            用户提交的密码
	 * @param savedPassword
	 *            服务端保存的密码。通常在数据库中取出
	 * @return true 表示为合法密码
	 */
	public boolean auth(String encryptedPassword, String savedPassword) {
		String client = getHashedPassword(encryptedPassword, getAesKey()),
				server = getHashedPassword(savedPassword, getServerAES_key());

		return client.equals(server);
	}

	public String getServerAES_key() {
		return serverAES_key;
	}

	public void setServerAES_key(String serverAES_key) {
		this.serverAES_key = serverAES_key;
	}

}
